package mylab.commons.web.mvc.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import mylab.base.model.entity.Entity;
import mylab.starters.mybatis.template.SuperService;
import mylab.starters.mybatis.template.dto.PageParam;

import java.io.Serializable;

/**
 * controller~分页查询
 *
 * @param <K> 对应的entity的ID
 * @param <E> 对应的entity
 * @param <S> 对应的service
 * @param <D> 对应的dto
 */
public interface PageController<
        K extends Serializable,
        E extends Entity<K>,
        S extends SuperService<K, E>,
        D>
        extends BaseController<K, E, S> {


    default IPage<E> pageQuery(PageParam<D> pageParam) {
        // 根据前端传递的参数，构建查询条件
        QueryWrapper<E> wrapper = pageParam.wrapper(getEntityClass());
        E po = fromPageQueryDTO(pageParam.getModel());
        wrapper.setEntity(po);

        //查询执行前可再次加工wrapper
        processPageQueryWrapper(wrapper);

        // 执行单表分页查询
        IPage<E> page = new Page<>(pageParam.getCurrent(), pageParam.getSize());
        page = getService().page(page, wrapper);
        return page;
    }

    default E fromPageQueryDTO(D queryDTO) {
        return dtoToPo(queryDTO);
    }

    default void processPageQueryWrapper(QueryWrapper<E> wrapper) {
    }
}
